package learn1;
//方法引用的学习--方法引用的分类
//1.引用静态方法
//2.引用成员方法
//3.引用构造方法
//4.其他调用方式

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.function.Predicate;

public class test2 {
    //方法引用的学习
    public static void main(String[] args) {
        //1.引用静态方法
        //格式:   类名::静态方法名
        //示例 :
        ArrayList<String> list = new ArrayList<>();
        Collections.addAll(list,"1","2","3","4","5");

        //常规方法
        ArrayList<Integer> list1 = new ArrayList<>();
        for (String s : list) {
            list1.add(Integer.parseInt(s));
        }

        //方法引用的写法
        List<Integer> list2 = list.stream().map(new Function<String, Integer>() {
            @Override
            public Integer apply(String s) {
                return Integer.parseInt(s);
            }
        }).collect(Collectors.toList());


        list.stream().map(Integer::parseInt);

        //2.引用成员方法
        //格式:   类名::成员方法名
        //其他类： 其他类对象::成员方法名
        //当前类： this::成员方法名
        //父类：  父类对象::成员方法名

        //示例 :
        ArrayList<Integer> list3 = new ArrayList<>();
        Collections.addAll(list3,1,2,3,4,5);
        //过滤数据只要偶数
        List<Integer> list4 = list3.stream().filter(new Predicate<Integer>() {
            @Override
            public boolean test(Integer integer) {
                return integer%2==0;
            }
        }).collect(Collectors.toList());

        //3.引用构造方法
        //格式:   类名::new
        //示例 :  String::new

        //4.其他调用方式

        //使用类名引用成员方法
        //格式:   类名::成员方法名
        //示例 :  String::substring

        //需要有函数式接口的支持
        //被引用的方法必须已经存在
        //被引用方法的形参需要跟抽象方法的第二个形参到最后一个形参一致
        //      返回值需要保持一致
        //方法的功能需要保持一致

        //抽象方法的形参详解
        //第一个参数：表示被引用方法的调用者，决定了可以引用哪些类中的方法
                  // 在Stream流中，第一个参数表示流中的数据类型
                  // 假设流里面的数据是字符串，那么使用这种方法进行方法引用
                  // 那么第一个参数就是String，只能引用String这个类中的方法

        ArrayList<String> list5 = new ArrayList<>();
        Collections.addAll(list5,"aaa","bbb","ccc");

        List<String> list6 = list5.stream().map(String::toUpperCase).toList();


        List<String> list7 = list5.stream().map(new Function<String, String>() {
            @Override
            public String apply(String s) {
                return s.toUpperCase();
            }
        }).toList();

        System.out.println(list6);

        //引用数组的构建方法
        //格式:   数组类型[]::new
        //示例 :  String[]::new

    }

    public static int sub(int a,int b){
        System.out.println(a-b);
        return a-b;
    }

}
